package Model.Evenement;

import Model.Dessin;
import Model.Motif;

/**
 * Cette class permet de définir un évènement en général.
 * 
 * @author Kilian Cousein et Benjamin Tardieu
 */
public abstract class Evenement
{
//======================================================================//
//============================ Variables ===============================//
//======================================================================//
	
	protected Motif motifInitial; // motif avant l'execution de l'évènement.
	protected Motif motifApresEvenement; // motif après l'execution de l'évènement.
	protected Dessin dessin; // dessin auquel le motif est relié.
	
	
//======================================================================//
//========================== Constructeurs =============================//
//======================================================================//

	/**
	 * Crée une nouvelle instance de <i>Evenement</i> qui sera associé au <i>dessin</i>.
	 * 
	 * @param dessin Dessin auquel le motif est relié
	 */
	public Evenement(Dessin dessin)
	{
		this.dessin = dessin;
	}
	
	
	/**
	 * Crée une nouvelle instance de <i>Evenement</i> qui sera un clone de <i>evenement</i>.
	 * 
	 * @param evenement L'évènement
	 */
	public Evenement(Evenement evenement)
	{
		this.dessin = evenement.dessin;
		this.motifInitial = evenement.motifInitial.clone();
		this.motifApresEvenement = evenement.motifApresEvenement.clone();

		if(this.motifInitial != null)
			this.motifInitial.setSelectionne(false);
		
		if(this.motifApresEvenement != null)
			this.motifApresEvenement.setSelectionne(false);
	}
	
	
//======================================================================//
//======================== Méthodes abstraites =========================//
//======================================================================//	
	
	/**
	 * Cette méthode permet annulation l'état d'un évènement. Ce qui permet d'annuler une action faîte par un utilisateur.
	 */
	public abstract void annuler();
	
	
	/**
	 * Cette méthode permet rétablir l'état d'un évènement. Ce qui permet de rétablir une action précédemment annuler.
	 */
	public abstract void retablir();
	
	
	/**
	 * Cette méthode permet cloner l'évènement.
	 * 
	 * @return Le clone de l'évènement.
	 */
	public abstract Evenement clone();
	
	
//======================================================================//
//============================= Méthodes ===============================//
//======================================================================//
	
	/**
	 * Cette méthode permet d'executer un évènement.<br/>Ce qui permet de prendre en compte l'action réalisée par l'utilisateur.
	 */
	public void executer()
	{
		this.retablir();
	}
	
	
	/**
	 * Cette méthode permet de vérifier si le motif après l'évènement est égale au motif initial.
	 * 
	 * @return vrai si le motif initial est égale au motif après l'évènement, sinon faux.
	 */
	public boolean motifsEgaux()
	{
		return this.motifInitial.equals(this.motifApresEvenement);
	}
	
	
	/** 
	 * Cette méthode permet de décrire un objet <i>Evenement</i>.
	 * 
	 * @return Une chaîne de caractère décrivant un objet de type Evenement
	 */
	public String toString()
	{
		return this.motifInitial+" ====> "+this.motifApresEvenement;
	}
	
	
//======================================================================//
//========================= Getters et Setters =========================//
//======================================================================//
	
	/**
	 * Retourne le motif avant l'execution de l'évènement.
	 * 
	 * @return Le motif avant l'execution de l'évènement.
	 */
	public Motif getMotifInitial()
	{
		return this.motifInitial;
	}
	

	/**
	 * Cette méthode permet de modifier le motif initial de l'évènement.
	 * 
	 * @param motifInitial Nouvelle valeur du motif initial.
	 */
	public void setMotifInitial(Motif motifInitial)
	{
		this.motifInitial = motifInitial;
	}
	

	/**
	 * Retourne le motif après l'execution de l'évènement.
	 * 
	 * @return Le motif après l'execution de l'évènement.
	 */
	public Motif getMotifApresEvenement()
	{
		return this.motifApresEvenement;
	}
	

	/**
	 * Cette méthode permet de modifier le motif après l'execution de l'évènement.
	 * 
	 * @param motifApresEvenement Nouvelle valeur du motif après l'execution de l'évènement.
	 */
	public void setMotifApresEvenement(Motif motifApresEvenement)
	{
		this.motifApresEvenement = motifApresEvenement;
	}
}
